import cv2
#人脸检测函数
def face_detect_demo(image):
    gray = cv2.cvtColor(image,cv2.COLOR_BGR2GRAY)
    face_detector = cv2.CascadeClassifier("haarcascade_frontalface_default.xml")
    faces = face_detector.detectMultiScale(gray, 1.2, 6)
    #如果未检测到人脸则返回原图像
    if (len(faces) == 0):
        return None, None
    (x, y, w, h) = faces[0]
    return gray[y:y + w, x:x + h], faces[0]

#导入训练结果
recognizer = cv2.face.LBPHFaceRecognizer_create()
recognizer.read('train.yml')#读取前文训练的结果

#根据给定的人脸坐标在图像上绘制矩形
def draw_rectangle(img, rect):
    (x, y, w, h) = rect#矩形框
    cv2.rectangle(img, (x, y ), (x + w, y + h),(255, 255, 0), 2)

# 根据给定的人脸（x，y）坐标写出人名
def draw_text(img, text, x, y):
    cv2.putText(img, text, (x, y), cv2.FONT_HERSHEY_COMPLEX, 1, (128, 128, 0), 2)

#此函数识别图像中的人物并在脸部周围绘制一个矩形及人名
facelabel = ["LiuYifei", "YangMi"]#人物名
def predict(image):
    #生成图像的副本，保留原始图像
    img = image.copy()
    #检测人脸区域
    face, rect = face_detect_demo(img)
    #预测人脸名字
    label = recognizer.predict(face)
    print(label)
    if label[1] <= 50:
        label_text = facelabel[label[0]]
        draw_rectangle(img, rect)
        draw_text(img, label_text, rect[0], rect[1])
        return img
    else:
        # 在检测到的脸部周围画一个矩形
        draw_rectangle(img, rect)
        # 标出预测的人名
        draw_text(img, "not find", rect[0], rect[1])
        # 返回预测的图像
        return img
test_img = cv2.imread("D:\\python_pycharm\\project1\\one\\1.JPG")
#执行预测
pred_img = predict(test_img)
cv2.imshow('result',pred_img)
cv2.waitKey(0)
cv2.destroyAllWindows()
